﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using MontagsmalerApp.ViewModels;
using System.Collections.ObjectModel;

namespace MontagsmalerApp.Views
{
	/// <summary>
	/// Interaktionslogik für SpielerWaehlenWindow.xaml
	/// </summary>
	public partial class SpielerWaehlenWindow : Window
	{
		/// <summary>
		/// Verweis auf das Spiel Objekt, um den aktuellen Spieler setzen zu können.
		/// </summary>
		public Spiel Spiel;

		/// <summary>
		/// Constructor.
		/// </summary>
		/// <param name="spiel"></param>
		public SpielerWaehlenWindow(Spiel spiel)
		{
			Spiel = spiel;

			InitializeComponent();
			GenerateGrid();
		}

		/// <summary>
		/// Baut die Spieler-Auswahl-Tabelle auf.
		/// </summary>
		private void GenerateGrid()
		{
			IList<Spielerteam> spielerteams = Spielerverwaltung.Instance.Spielerteams;

			if (spielerteams == null || spielerteams.Count == 0)
				return;

			StackPanel stackPanelHorizontal = new StackPanel();
			stackPanelHorizontal.Orientation = Orientation.Horizontal;

			foreach (var team in spielerteams)
			{
				// neuer für Team StackPanel
				StackPanel stackPanelVertical = new StackPanel();
				stackPanelVertical.Orientation = Orientation.Vertical;

				// Teamname + Punkte als Header
				Button btnTeam = new Button();
				btnTeam.Content = team.Name;
				btnTeam.DataContext = team;
				btnTeam.ToolTip = "Dieses Team auswählen";
				btnTeam.Click += new RoutedEventHandler(btnTeam_Click); 

				// Möglichkeit Punkte hinzuzufügen
				Button btnAddPoints = new Button();
				Uri imgCoinsAddUri = new Uri("/MontagsmalerApp;component/Images/Coins-Add.png", UriKind.Relative);
				BitmapImage imgCoinsAdd = new BitmapImage(imgCoinsAddUri);
				btnAddPoints.Content = new Image() { Source = imgCoinsAdd };
				btnAddPoints.Width = 23;
				btnAddPoints.Height = 25;
				btnAddPoints.DataContext = team;
				btnAddPoints.ToolTip = "Punkte hinzufügen";
				btnAddPoints.Click += new RoutedEventHandler(btnAddPoints_Click);

				stackPanelVertical.Children.Add(btnAddPoints);
				stackPanelVertical.Children.Add(btnTeam);

				// Einzelspieler als Buttons auflisten
				foreach (var spieler in team.Einzelspieler)
				{
					StackPanel stackPanelSpieler = new StackPanel();
					stackPanelSpieler.Orientation = Orientation.Horizontal;
					stackPanelSpieler.Margin = new Thickness(5, 5, 5, 5);

					//button Undo
					Button btnUndo = new Button();
					Uri imgArrowUndoUri = new Uri("/MontagsmalerApp;component/Images/Arrow-Undo.png", UriKind.Relative);
					BitmapImage imgArrowUndo = new BitmapImage(imgArrowUndoUri);
					btnUndo.Content = new Image() { Source = imgArrowUndo };
					btnUndo.Margin = new Thickness(2, 0, 0, 0);
					btnUndo.Width = 23;
					btnUndo.Height = 25;
					btnUndo.IsEnabled = spieler.GetAktuellePunkte() != 0;
					btnUndo.DataContext = spieler;
					btnUndo.ToolTip = "Zurücksetzen";
					btnUndo.Click += new RoutedEventHandler(btnUndo_Click);

					//button Spieler
					Button btnSpieler = new Button();
					btnSpieler.Content = spieler.Name;
					btnSpieler.DataContext = spieler;
					btnSpieler.ToolTip = "Diesen Spieler auswählen";
					btnSpieler.Click += new RoutedEventHandler(btnSpieler_Click);

					stackPanelSpieler.Children.Add(btnUndo);
					stackPanelSpieler.Children.Add(btnSpieler);

					stackPanelVertical.Children.Add(stackPanelSpieler);
				}

				stackPanelHorizontal.Children.Add(stackPanelVertical);
			}

			grdSpieler.Children.Clear();
			grdSpieler.Children.Add(stackPanelHorizontal);
		}

		/// <summary>
		/// Wird ein Team durch den Button ausgewählt, dann wird es der aktuelle Spieler des Spiels und das Window wird verlassen. 
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void btnTeam_Click(object sender, RoutedEventArgs e)
		{
			Button btnSender = (Button)sender;
			if (btnSender != null)
			{
				if (btnSender.DataContext is Spielerteam)
				{
					Spielerteam team = (Spielerteam)btnSender.DataContext;
					Spiel.AktuellerSpieler = team;
					this.Close();
				}
			}
		}

		/// <summary>
		/// Wird auf den Button geklickt, so kann man in einem neuen Fenster Punkte gutschreiben.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void btnAddPoints_Click(object sender, RoutedEventArgs e)
		{
			Button btnSender = (Button)sender;
			if (btnSender != null)
			{
				if (btnSender.DataContext is Spielerteam)
				{
					Spielerteam team = (Spielerteam)btnSender.DataContext;

					TeamAddPointsWindow teamAddPointsWindow = new TeamAddPointsWindow(team);
					teamAddPointsWindow.ShowDialog();

					GenerateGrid();
				}
			}
		}

		/// <summary>
		/// Wird auf diesen Button geklcikt, so werden die Punkte zurückgesetzt und der Spieler darf nochmal spielen.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void btnUndo_Click(object sender, RoutedEventArgs e)
		{
			Button btnSender = (Button)sender;
			if (btnSender != null)
			{
				if (btnSender.DataContext is Einzelspieler)
				{
					Einzelspieler spieler = (Einzelspieler)btnSender.DataContext;
					spieler.PunkteZuruecksetzen();
					GenerateGrid();
				}
			}
		}

		/// <summary>
		/// Wird ein Spieler durch den Button ausgewählt, dann wird er der aktuelle Spieler des Spiels und das Window wird verlassen.
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void btnSpieler_Click(object sender, RoutedEventArgs e)
		{
			Button btnSender = (Button)sender;
			if (btnSender != null)
			{
				if (btnSender.DataContext is Einzelspieler)
				{
					Einzelspieler spieler = (Einzelspieler)btnSender.DataContext;
					Spiel.AktuellerSpieler = spieler;
					this.Close();
				}
			}
		}
	}
}
